<?php
/**
 * 基于左右分值算法的无限分类学模型
 *
 * 数据表基本字段：id、lft、rgt、level,name
 *
 */

class TaxonomyModel extends Model {

	/**
	 * 插入一个节点
	 */
	protected function insertNode($parentNode,$newNode){
		$this->startTrans();
		//TODO 此处考虑未来对TP的修改，采用原生的SQL操作进行。参考：Db.class.php的parseSets方法，存在exp表达式
		$fullTableName=$this->getTableName();
		$this->execute('update '.$fullTableName.' set lft=lft+2 where lft>='.$parentNode['rgt']);
        $this->execute('update '.$fullTableName.' set rgt=rgt+2 where rgt>='.$parentNode['rgt']);
        $parentRgt=intval($parentNode['rgt']);
		$newNode['lft']=$parentRgt;
		$newNode['rgt']=$parentRgt+1;
		$newNode['level']=intval($parentNode['level'])+1;
		$result=$this->add($newNode);
		if(false===$result){
			$this->rollback();
			return false;
		}
		$this->commit();
		return $result;
	}

    /**
     * 检查某父节点的下一层节点是是否存在同属性节点
     */
    protected function checkNodeExistedHierarchy($parentNode,$checkNode,$checkField='name'){
        $cond=' level='.(intval($parentNode)+1);        //确定层级
        $cond.=' and lft between '.$parentNode['lft'].' and '.$parentNode['rgt'];       //确定子节点范围
        $cond.=' and '.$checkField.'=\''.$checkNode[$checkField].'\'';
        if($this->where($cond)->find()){
            return false;
        }
        return true;
    }

    /**
     * 获取树的树状结构
     *
     * filter过滤条件，直接写入where字段
     */
    public function getTree($filter='',$parentNode=null){
        $where=array();
        if($filter) $where[]=$filter;
        if($parentNode) $where[]='lft between '.$parentNode['lft'].' and '.$parentNode['rgt'];
        if(count($parentNode)>0) $this->where(implode(' and ',$where));
        return $this->order('lft')->findAll();
    }

}

?>